package com.jch.dm9_serial_thread_confinement.reusable;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Future;

/**
 * Serializer参与者可复用实现
 * @param <T> Serializer向WorkerThread所提交的任务对应的类型
 * @param <V> service方法的返回值类型
 */
public abstract class AbstractSerializer<T,V> {

    private final TerminableWorkerThread<T,V> workerThread;

    public AbstractSerializer(BlockingQueue<Runnable> workQueue,TaskProcessor<T,V> taskProcessor){
        workerThread = new TerminableWorkerThread<T,V>(workQueue,taskProcessor);
    }

    /**
     * 生成相应的任务实例
     * @param params 参数列表
     * @return 任务实例
     */
    protected abstract T makeTask(Object... params);

    /**
     * 对外暴露的服务方法
     * @param params 参数列表
     * @return 任务处理结果的Promise实例
     * @throws InterruptedException
     */
    protected Future<V> service(Object... params)throws InterruptedException{
        T task = makeTask(params);
        Future<V> resultPromise = workerThread.submit(task);
        return resultPromise;
    }

    // 初始化该类对外暴露的服务
    public void init(){
        workerThread.start();
    }

    // 停止该类对外暴露的服务
    public void shutdown(){
        workerThread.terminate();
    }
}
